import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * 窗口类: 继承Frame类,可以重写它的paint()方法,实现往里面画图
 */
public class TankFrame extends Frame {

    private Tank myTank;




    public TankFrame() {
        this.setTitle("Tank War");
        this.setLocation(400, 100);
        this.setSize(800, 600);

        /*
         * 观察者模式部类只给这个当前的类使用,而不需要给外部使用(监听类)
         *       内部类可以非常方便地访问包装类的
         * addKeyListener() 需要传递一个接口,
         *       可以使用内部类的方式,因为这个内局部变量
         * 设计原则: 高内聚 低耦合  --  自己用的东西都放在自己里面,能不对外开放的就不对外开放
         * */
        this.addKeyListener(new TankKeyListener());
        myTank = new Tank(100, 100, Dir.R);

    }

    /*
     * 自动调用这个方法,需要重新绘制的时候就会调用这个方法
     * */
    @Override
    public void paint(
            Graphics g  /* 这个参数代表是画图的时候的一个画笔 */
    ) {
        // 画出小方块  -- 让 坦克自己去画  : 把画笔交给坦克
        myTank.paint(g);

    }

    /*
     * 内部类 : 继承 KeyAdapter (抽象类) 只需要重写自己所需要的的方法就可以
     * 使用private 修饰可以不让外部知道
     * */
    private class TankKeyListener extends KeyAdapter {



        // 观察者模式
        @Override
        public void keyPressed(
                KeyEvent e   // 键盘事件
        ) {
            // 按键处理把事件传递给坦克,让坦克自己去处理
            myTank.keyPressed(e);
        }

        @Override
        public void keyReleased(KeyEvent e) {
            myTank.keyReleased(e);
        }
    }
}
